<!DOCTYPE html>
<html class="writer-html5" lang="en" data-content_root="../../">
<head>
  <meta charset="utf-8" /><meta name="viewport" content="width=device-width, initial-scale=1" />

  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <title>uses/2 &mdash; The Logtalk Handbook v3.93.0-b01 documentation</title>
      <link rel="stylesheet" type="text/css" href="../../_static/pygments.css?v=d75fae25" />
      <link rel="stylesheet" type="text/css" href="../../_static/css/theme.css?v=19f00094" />
      <link rel="stylesheet" type="text/css" href="../../_static/css/custom.css?v=396eccfe" />

  
  <!--[if lt IE 9]>
    <script src="../../_static/js/html5shiv.min.js"></script>
  <![endif]-->
  
        <script src="../../_static/jquery.js?v=5d32c60e"></script>
        <script src="../../_static/_sphinx_javascript_frameworks_compat.js?v=2cd50e6c"></script>
        <script src="../../_static/documentation_options.js?v=c8100655"></script>
        <script src="../../_static/doctools.js?v=9a2dae69"></script>
        <script src="../../_static/sphinx_highlight.js?v=dc90522c"></script>
    <script src="../../_static/js/theme.js"></script>
    <!-- begin favicon -->
    <link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png" />
    <link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png" />
    <link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png" />
    <link rel="manifest" href="/site.webmanifest" />
    <link rel="mask-icon" href="/safari-pinned-tab.svg" color="#5bbad5" />
    <meta name="msapplication-TileColor" content="#355b95" />
    <meta name="theme-color" content="#ffffff" />
    <!-- end favicon -->
    
    <link rel="index" title="Index" href="../../genindex.html" />
    <link rel="search" title="Search" href="../../search.html" />
    <link rel="next" title="use_module/2" href="use_module_2.html" />
    <link rel="prev" title="synchronized/1" href="synchronized_1.html" />
   
</head>

<body class="wy-body-for-nav"> 
  <div class="wy-grid-for-nav">
    <nav data-toggle="wy-nav-shift" class="wy-nav-side">
      <div class="wy-side-scroll">
        <div class="wy-side-nav-search" >

          
          
          <a href="../../index.html" class="icon icon-home">
            The Logtalk Handbook
              <img src="../../_static/logtalk.gif" class="logo" alt="Logo"/>
          </a>
              <div class="version">
                3.93.0
              </div>
<div role="search">
  <form id="rtd-search-form" class="wy-form" action="../../search.html" method="get">
    <input type="text" name="q" placeholder="Search docs" aria-label="Search docs" />
    <input type="hidden" name="check_keywords" value="yes" />
    <input type="hidden" name="area" value="default" />
  </form>
</div>
        </div><div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Navigation menu">
    
              <p class="caption" role="heading"><span class="caption-text">Contents</span></p>
<ul class="current">
<li class="toctree-l1"><a class="reference internal" href="../../userman/index.html">User Manual</a></li>
<li class="toctree-l1 current"><a class="reference internal" href="../index.html">Reference Manual</a><ul class="current">
<li class="toctree-l2"><a class="reference internal" href="../grammar.html">Grammar</a></li>
<li class="toctree-l2"><a class="reference internal" href="../control/index.html">Control constructs</a></li>
<li class="toctree-l2 current"><a class="reference internal" href="index.html">Directives</a><ul class="current">
<li class="toctree-l3"><a class="reference internal" href="source_file_directives.html">Source file directives</a></li>
<li class="toctree-l3"><a class="reference internal" href="conditional_compilation_directives.html">Conditional compilation directives</a></li>
<li class="toctree-l3"><a class="reference internal" href="entity_directives.html">Entity directives</a></li>
<li class="toctree-l3 current"><a class="reference internal" href="predicate_directives.html">Predicate directives</a><ul class="current">
<li class="toctree-l4"><a class="reference internal" href="alias_2.html"><code class="docutils literal notranslate"><span class="pre">alias/2</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="coinductive_1.html"><code class="docutils literal notranslate"><span class="pre">coinductive/1</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="discontiguous_1.html"><code class="docutils literal notranslate"><span class="pre">discontiguous/1</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="dynamic_1.html"><code class="docutils literal notranslate"><span class="pre">dynamic/1</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="info_2.html"><code class="docutils literal notranslate"><span class="pre">info/2</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="meta_predicate_1.html"><code class="docutils literal notranslate"><span class="pre">meta_predicate/1</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="meta_non_terminal_1.html"><code class="docutils literal notranslate"><span class="pre">meta_non_terminal/1</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="mode_2.html"><code class="docutils literal notranslate"><span class="pre">mode/2</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="multifile_1.html"><code class="docutils literal notranslate"><span class="pre">multifile/1</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="op_3.html"><code class="docutils literal notranslate"><span class="pre">op/3</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="private_1.html"><code class="docutils literal notranslate"><span class="pre">private/1</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="protected_1.html"><code class="docutils literal notranslate"><span class="pre">protected/1</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="public_1.html"><code class="docutils literal notranslate"><span class="pre">public/1</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="synchronized_1.html"><code class="docutils literal notranslate"><span class="pre">synchronized/1</span></code></a></li>
<li class="toctree-l4 current"><a class="current reference internal" href="#"><code class="docutils literal notranslate"><span class="pre">uses/2</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="use_module_2.html"><code class="docutils literal notranslate"><span class="pre">use_module/2</span></code></a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="../predicates/index.html">Built-in predicates</a></li>
<li class="toctree-l2"><a class="reference internal" href="../methods/index.html">Built-in methods</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../../tutorial/index.html">Tutorial</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../faq/index.html">FAQ</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../devtools/index.html">Developer Tools</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../libraries/index.html">Libraries</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../ports/index.html">Ports</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../contributions/index.html">Contributions</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../glossary.html">Glossary</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../bibliography.html">Bibliography</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../genindex.html">Index</a></li>
</ul>

    <p class="caption"><span class="caption-text">External Contents</span></p>
    <ul>
    <li class="toctree-l1"><a class="reference internal" href="../../../apis/index.html">APIs</a></li>
    <li class="toctree-l1"><a class="reference internal" href="https://logtalk.org">Logtalk website</a></li>
    <li class="toctree-l1"><a class="reference internal" href="https://github.com/LogtalkDotOrg/logtalk3">GitHub repo</a></li>
    </ul>
  
        </div>
      </div>
    </nav>

    <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"><nav class="wy-nav-top" aria-label="Mobile navigation menu" >
          <i data-toggle="wy-nav-top" class="fa fa-bars"></i>
          <a href="../../index.html">The Logtalk Handbook</a>
      </nav>

      <div class="wy-nav-content">
        <div class="rst-content">
          <div role="navigation" aria-label="Page navigation">
  <ul class="wy-breadcrumbs">
      <li><a href="../../index.html" class="icon icon-home" aria-label="Home"></a></li>
          <li class="breadcrumb-item"><a href="../index.html">Reference Manual</a></li>
          <li class="breadcrumb-item"><a href="index.html">Directives</a></li>
          <li class="breadcrumb-item"><a href="predicate_directives.html">Predicate directives</a></li>
      <li class="breadcrumb-item active"><code class="docutils literal notranslate"><span class="pre">uses/2</span></code></li>
      <li class="wy-breadcrumbs-aside">
              <a href="https://github.com/LogtalkDotOrg/logtalk3/blob/master/docs/handbook/sources/refman/directives/uses_2.rst" class="fa fa-github"> Edit on GitHub</a>
      </li>
  </ul>
  <hr/>
</div>
          <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
           <div itemprop="articleBody">
             
  <p class="align-right"><strong>directive</strong></p>
<section id="uses-2">
<span id="directives-uses-2"></span><span id="index-0"></span><h1><code class="docutils literal notranslate"><span class="pre">uses/2</span></code><a class="headerlink" href="#uses-2" title="Link to this heading"></a></h1>
<section id="description">
<h2>Description<a class="headerlink" href="#description" title="Link to this heading"></a></h2>
<div class="highlight-logtalk notranslate"><div class="highlight"><pre><span></span>uses(<span class="nv">Object</span>, [<span class="nv">Name</span><span class="o">/</span><span class="nv">Arity</span>, ...])
uses(<span class="nv">Object</span>, [<span class="nv">Name</span><span class="o">/</span><span class="nv">Arity</span> <span class="o">as</span> <span class="nv">Alias</span><span class="o">/</span><span class="nv">Arity</span>, ...])

uses(<span class="nv">Object</span>, [<span class="nv">Predicate</span> <span class="o">as</span> <span class="nv">Alias</span>, ...])

uses(<span class="nv">Object</span>, [<span class="nv">Name</span><span class="o">//</span><span class="nv">Arity</span>, ...])
uses(<span class="nv">Object</span>, [<span class="nv">Name</span><span class="o">//</span><span class="nv">Arity</span> <span class="o">as</span> <span class="nv">Alias</span><span class="o">//</span><span class="nv">Arity</span>, ...])

uses(<span class="nv">Object</span>, [<span class="k">op</span>(<span class="nv">Precedence</span>, <span class="nv">Associativity</span>, <span class="nv">Operator</span>), ...])
</pre></div>
</div>
<p>Declares that all calls made from predicates (or non-terminals) defined
in the category or object containing the directive to the specified
predicates (or non-terminals) are to be interpreted as messages to the
specified object. Thus, this directive may be used to simplify writing
of predicate definitions by allowing the programmer to omit the
<code class="docutils literal notranslate"><span class="pre">Object::</span></code> prefix when using the predicates listed in the directive
(as long as the calls do not occur as arguments for non-standard Prolog
meta-predicates not declared in the adapter files). It is also possible
to include operator declarations in the second argument.</p>
<p>This directive is also taken into account when compiling calls to the
<a class="reference internal" href="../../userman/predicates.html#predicates-database"><span class="std std-ref">database</span></a> and
<a class="reference internal" href="../../userman/predicates.html#predicates-reflection"><span class="std std-ref">reflection</span></a> built-in methods by looking
into these methods predicate arguments if bound at compile-time.</p>
<p>It is possible to specify a predicate alias using the notation
<code class="docutils literal notranslate"><span class="pre">Name/Arity</span> <span class="pre">as</span> <span class="pre">Alias/Arity</span></code> or, in alternative, the notation
<code class="docutils literal notranslate"><span class="pre">Name/Arity::Alias/Arity</span></code>. Aliases may be used to avoid
conflicts between predicates specified in <code class="docutils literal notranslate"><span class="pre">use_module/2</span></code> and <code class="docutils literal notranslate"><span class="pre">uses/2</span></code>
directives, for giving more meaningful names considering the calling
context of the predicates, and to change the order of the predicate
arguments when calling the predicate. For predicates, it is also possible
to define alias shorthands using the notation <code class="docutils literal notranslate"><span class="pre">Predicate</span> <span class="pre">as</span> <span class="pre">Alias</span></code> or,
in alternative, the notation <code class="docutils literal notranslate"><span class="pre">Predicate::Alias</span></code>, where <code class="docutils literal notranslate"><span class="pre">Predicate</span></code>
and <code class="docutils literal notranslate"><span class="pre">Alias</span></code> are callable terms where some or all arguments may be
instantiated.</p>
<p>To enable the use of <a class="reference internal" href="../../glossary.html#term-static-binding"><span class="xref std std-term">static binding</span></a>, and thus optimal message-sending
performance, the objects should be loaded before compiling the entities
that call their predicates.</p>
<p>The object identifier argument can also be a <a class="reference internal" href="../../glossary.html#term-parameter-variable"><span class="xref std std-term">parameter variable</span></a>
when using the directive in a parametric object or a parametric category
defined in a source file (the common case). In this case, <a class="reference internal" href="../../glossary.html#term-dynamic-binding"><span class="xref std std-term">dynamic binding</span></a>
will be used for all listed predicates (and non-terminals). The parameter
variable must be instantiated at runtime when the messages are sent.</p>
</section>
<section id="template-and-modes">
<h2>Template and modes<a class="headerlink" href="#template-and-modes" title="Link to this heading"></a></h2>
<div class="highlight-logtalk notranslate"><div class="highlight"><pre><span></span>uses(<span class="o">+</span>object_identifier, <span class="o">+</span>predicate_indicator_list)
uses(<span class="o">+</span>object_identifier, <span class="o">+</span>predicate_indicator_alias_list)

uses(<span class="o">+</span>object_identifier, <span class="o">+</span>predicate_template_alias_list)

uses(<span class="o">+</span>object_identifier, <span class="o">+</span>non_terminal_indicator_list)
uses(<span class="o">+</span>object_identifier, <span class="o">+</span>non_terminal_indicator_alias_list)

uses(<span class="o">+</span>object_identifier, <span class="o">+</span>operator_list)
</pre></div>
</div>
</section>
<section id="examples">
<h2>Examples<a class="headerlink" href="#examples" title="Link to this heading"></a></h2>
<div class="highlight-logtalk notranslate"><div class="highlight"><pre><span></span><span class="p">:- </span><span class="k">uses</span>(list,  [append<span class="o">/</span><span class="m">3</span>, member<span class="o">/</span><span class="m">2</span>]).
<span class="p">:- </span><span class="k">uses</span>(store, [data<span class="o">/</span><span class="m">2</span>]).
<span class="p">:- </span><span class="k">uses</span>(user,  [table<span class="o">/</span><span class="m">4</span>]).

foo <span class="o">:-</span>
    ...,
    <span class="c">% the same as findall(X, list::member(X, L), A)</span>
    <span class="k">findall</span>(<span class="nv">X</span>, member(<span class="nv">X</span>, <span class="nv">L</span>), <span class="nv">A</span>),
    <span class="c">% the same as list::append(A, B, C)</span>
    append(<span class="nv">A</span>, <span class="nv">B</span>, <span class="nv">C</span>),
    <span class="c">% the same as store::assertz(data(X, C))</span>
    <span class="k">assertz</span>(data(<span class="nv">X</span>, <span class="nv">C</span>)),
    <span class="c">% call the table/4 predicate in &quot;user&quot;</span>
    table(<span class="nv">X</span>, <span class="nv">Y</span>, <span class="nv">Z</span>, <span class="nv">T</span>),
    ...
</pre></div>
</div>
<p>Another example, using the extended notation that allows us to define
predicate aliases:</p>
<div class="highlight-logtalk notranslate"><div class="highlight"><pre><span></span><span class="p">:- </span><span class="k">uses</span>(btrees, [new<span class="o">/</span><span class="m">1</span> <span class="o">as</span> new_btree<span class="o">/</span><span class="m">1</span>]).
<span class="p">:- </span><span class="k">uses</span>(queues, [new<span class="o">/</span><span class="m">1</span> <span class="o">as</span> new_queue<span class="o">/</span><span class="m">1</span>]).

btree_to_queue <span class="o">:-</span>
    ...,
    <span class="c">% the same as btrees::new(Tree)</span>
    new_btree(<span class="nv">Tree</span>),
    <span class="c">% the same as queues::new(Queue)</span>
    new_queue(<span class="nv">Queue</span>),
    ...
</pre></div>
</div>
<p>An example of defining a predicate alias that is also a shorthand:</p>
<div class="highlight-logtalk notranslate"><div class="highlight"><pre><span></span><span class="p">:- </span><span class="k">uses</span>(logtalk, [
    print_message(debug, my_app, <span class="nv">Message</span>) <span class="o">as</span> dbg(<span class="nv">Message</span>)
]).
</pre></div>
</div>
<p>Predicate aliases can also be used to change argument order:</p>
<div class="highlight-logtalk notranslate"><div class="highlight"><pre><span></span><span class="p">:- </span><span class="k">uses</span>(meta, [
    fold_left(<span class="nv">Closure</span>,<span class="nv">Accumulator</span>,<span class="nv">List</span>,<span class="nv">Result</span>) <span class="o">as</span> foldl(<span class="nv">Closure</span>,<span class="nv">List</span>,<span class="nv">Accumulator</span>,<span class="nv">Result</span>)
]).
</pre></div>
</div>
<p>An example of using a <a class="reference internal" href="../../glossary.html#term-parameter-variable"><span class="xref std std-term">parameter variable</span></a> in place of the object
identifier to allow using the same test set for checking multiple
implementations of the same protocol:</p>
<div class="highlight-logtalk notranslate"><div class="highlight"><pre><span></span><span class="p">:- </span><span class="k">object</span>(tests(<span class="nv">_HeapObject_</span>),
    <span class="k">extends</span>(lgtunit)).

<span class="p">    :- </span><span class="k">uses</span>(<span class="nv">_HeapObject_</span>, [
        as_heap<span class="o">/</span><span class="m">2</span>, as_list<span class="o">/</span><span class="m">2</span>, valid<span class="o">/</span><span class="m">1</span>, new<span class="o">/</span><span class="m">1</span>,
        insert<span class="o">/</span><span class="m">4</span>, insert_all<span class="o">/</span><span class="m">3</span>, delete<span class="o">/</span><span class="m">4</span>, merge<span class="o">/</span><span class="m">3</span>,
        empty<span class="o">/</span><span class="m">1</span>, size<span class="o">/</span><span class="m">2</span>, top<span class="o">/</span><span class="m">3</span>, top_next<span class="o">/</span><span class="m">5</span>
    ]).
</pre></div>
</div>
<div class="admonition seealso">
<p class="admonition-title">See also</p>
<p><a class="reference internal" href="uses_1.html#directives-uses-1"><span class="std std-ref">uses/1</span></a>,
<a class="reference internal" href="use_module_1.html#directives-use-module-1"><span class="std std-ref">use_module/1</span></a>,
<a class="reference internal" href="use_module_2.html#directives-use-module-2"><span class="std std-ref">use_module/2</span></a>,
<a class="reference internal" href="alias_2.html#directives-alias-2"><span class="std std-ref">alias/2</span></a></p>
</div>
</section>
</section>


           </div>
          </div>
          <footer><div class="rst-footer-buttons" role="navigation" aria-label="Footer">
        <a href="synchronized_1.html" class="btn btn-neutral float-left" title="synchronized/1" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Previous</a>
        <a href="use_module_2.html" class="btn btn-neutral float-right" title="use_module/2" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a>
    </div>

  <hr/>

  <div role="contentinfo">
    <p>&#169; Copyright 1998-2025, Paulo Moura.</p>
  </div>

  Built with <a href="https://www.sphinx-doc.org/">Sphinx</a> using a
    <a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a>
    provided by <a href="https://readthedocs.org">Read the Docs</a>.
   

</footer>
        </div>
      </div>
    </section>
  </div>
  <script>
      jQuery(function () {
          SphinxRtdTheme.Navigation.enable(true);
      });
  </script> 

</body>
</html>